﻿using sipfe.model.dataAccess;
using sipfe.model.sqlExecutor;
using sipfe.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace sipfe.model.nuevo
{
    public class ConvocatoriaDAO
    {
        private BDSIPFEEntities db = new BDSIPFEEntities();
        

        public string[] AddNuevaConvocatoriaDAO(SIPMaeConvocatoria sipMaeConvocatoria, Dictionary<int, string[]> dictionaryTarifa)
        {
            DateTime hoy = UtilitariosUtil.FechaHoy();
            sipMaeConvocatoria.nAnio        =   UtilitariosUtil.yearNow();
            sipMaeConvocatoria.nNumeConvo = getNumeroConvocatoria(sipMaeConvocatoria.nIdeClaseSol);
            sipMaeConvocatoria.dtFecReg     =   DateTime.Now;
            sipMaeConvocatoria.dFecIniVig   =   hoy;
            sipMaeConvocatoria.nSaldo       =   sipMaeConvocatoria.nCantTotaBeca;

            foreach (var pair in dictionaryTarifa)
            {
                SIPDetConvocatoria sipDetConvocatoria = new SIPDetConvocatoria();
                sipDetConvocatoria.nIdeInstitucion  = pair.Key;
                sipDetConvocatoria.nIdeUsuReg       = sipMaeConvocatoria.nIdeUsuReg;
                sipDetConvocatoria.dFecIniVig       = hoy;
                sipDetConvocatoria.dtFecReg         = DateTime.Now;
                sipMaeConvocatoria.SIPDetConvocatoria.Add(sipDetConvocatoria);

                string arrayNivel       = pair.Value.ElementAt(0);
                string arrayConcepto    = pair.Value.ElementAt(1);
                string arrayModalidad   = pair.Value.ElementAt(2);
                string arrayBecas       = pair.Value.ElementAt(3);

                string[] arrayNivelItems        = arrayNivel.Split(',');
                string[] arrayConceptoItems     = arrayConcepto.Split(',');
                string[] arrayModalidadItems    = arrayModalidad.Split(',');
                string[] arrayBecasItems        = arrayBecas.Split(',');

                for (int i = 0; i < arrayNivelItems.Length; i++)
                {
                    SIPDetConvocatoriaItem sipDetConvocatoriaItem = new SIPDetConvocatoriaItem();
                    sipDetConvocatoriaItem.nIdeNivel = Int32.Parse(arrayNivelItems[i]);
                    sipDetConvocatoriaItem.nIdeConcepto = Int32.Parse(arrayConceptoItems[i]);
                    sipDetConvocatoriaItem.nIdeModalidad = Int32.Parse(arrayModalidadItems[i]);
                    sipDetConvocatoriaItem.nNumeroBeca = Int32.Parse(arrayBecasItems[i]);
                    sipDetConvocatoriaItem.dFecIniVig = hoy;
                    sipDetConvocatoriaItem.dtFecReg = DateTime.Now;
                    sipDetConvocatoriaItem.nIdeUsuReg = sipMaeConvocatoria.nIdeUsuReg;
                    sipDetConvocatoriaItem.nSaldo = Int32.Parse(arrayBecasItems[i]);
                    sipDetConvocatoria.SIPDetConvocatoriaItem.Add(sipDetConvocatoriaItem);
                }
            }
            db.SIPMaeConvocatoria.Add(sipMaeConvocatoria);
            db.SaveChanges();
            
            return new String[] { sipMaeConvocatoria.nIdeConvo.ToString() };
        }

        

        public string[] RegistraDatosEmpresaInpDAO_old(SIPMaeEmpresa sipMaeEmpresa)
        {
            db.SIPMaeEmpresa.Add(sipMaeEmpresa);
            db.SaveChanges();
            return new String[] { sipMaeEmpresa.nIdeEmpresa.ToString() };
        }
        public SIPMaeConvocatoria findSIPMaeConvocatoriaByIdDAO(decimal nIdeConvocatoria)
        {
            return db.SIPMaeConvocatoria.Where(x => x.nIdeConvo == nIdeConvocatoria).FirstOrDefault();
        }
        /*
        private decimal getNumeroConvocatoria(decimal? nullable)
        {
            throw new NotImplementedException();
        }
        */

        private decimal getNumeroConvocatoria(decimal? clase)
        {
            decimal annioNow = UtilitariosUtil.yearNow();
            StringBuilder sql = new StringBuilder();
            sql.Append("select isnull(MAX(nNumeConvo),0) + 1 from SIPMaeConvocatoria where nAnio=").Append(annioNow).Append(" and nIdeClaseSol=").Append(clase);          

            var max = db.Database.SqlQuery<Decimal>(sql.ToString());
            List<Decimal> valores = max.ToList<Decimal>();
            Decimal secuencia = valores.First<Decimal>();
            return secuencia;
        }

        public IList<dynamic> ListarConvocatoriaDAO(string fec_IniVig, string fec_FinVig, string ide_Empresa, string n_ClaseTramite, string n_IdeConvo)
        {
            String[] parametros = new String[] { fec_IniVig, fec_FinVig, ide_Empresa, n_ClaseTramite, n_IdeConvo };
            String[] nombreParametros = new String[] { "fec_IniVig", "fec_FinVig", "ide_Empresa", "n_ClaseTramite", "n_IdeConvo" };
            IList<dynamic> lista = SqlExecutorSP.executeStore("paListarSIPConvocatoriaPabe", parametros, nombreParametros);
            return lista;
        }

        public List<SIPMaeConvocatoria> ListarConvocatoriaDAO_old(string fec_IniVig, string fec_FinVig, string ide_Empresa, string n_ClaseTramite)
        {
            DateTime fecIniVig = UtilitariosUtil.formatearFecha(fec_IniVig);
            DateTime fecFinVig = UtilitariosUtil.formatearFecha(fec_FinVig);
            List<SIPMaeConvocatoria> lista = new List<SIPMaeConvocatoria>();
            SIPMaeConvocatoria itemConvo = null;
            StringBuilder sql = new StringBuilder();

            //sql.Append("(from t1 in db.SIPMaeConvocatoria");
            //sql.Append("join t2 in db.SIPDetConvocatoria on t1.nIdeConvo equals t2.nIdeConvo");
           // sql.Append("join t3 in db.SIPDetCompendio on t1.nIdeTipoConvo equals t3.nIdeDetalle");
           // sql.Append("join t4 in db.SIPMaeEmpresa on t2.nIdeInstitucion equals t4.nIdeEmpresa");
           // sql.Append("where t1.dFecIniVig >=").Append(fecIniVig).Append("&& (t1.dFecFinVig == null ? DateTime.Today : t1.dFecFinVig) <=").Append(fecFinVig);
           // sql.Append("select new {t1.nIdeConvo, t1.nNumeConvo, t1.nAnio, t1.vDescr, t1.nCantTotaBeca, t3.vNomCorto, t4.vRazonSocial,t1.dFecIniVig, t1.dFecFinVig, clase = t1.SIPDetCompendio1.vNomCorto, t1.nSaldo}");
           // sql.Append(").OrderByDescending(s => s.nIdeConvo);");


           //sql.Append("select t1.nIdeConvo, t1.nNumeConvo, t1.nAnio, t1.vDescr, t1.nCantTotaBeca, t1.nIdeTipoConvo,"); 
            //sql.Append("t1.dFecIniVig, t1.dFecFinVig, t1.nSaldo ");

        sql.Append("select t1.nIdeConvo, t1.nNumeConvo, t1.nAnio, t1.vDescr, t1.nCantTotaBeca,t1.dFecIniVig,  "); 
        sql.Append("t1.dFecFinVig, t1.nSaldo,t1.dtFecReg, t1.nIdeClaseSol, t1.nIdeTipoConvo,t1.nIdeUsuReg, "); 
        sql.Append("(select t3.vRazonSocial from SIPMaeEmpresa t3 where t3.nIdeEmpresa=t2.nIdeInstitucion) as vRazonSocial, "); 
        sql.Append("(select t4.vNomCorto from SIPDetCompendio t4 where t4.nIdeDetalle=t1.nIdeClaseSol) as vClase "); 
        sql.Append("from SIPMaeConvocatoria t1, SIPDetConvocatoria t2 "); 
        sql.Append("where t1.nIdeConvo=t2.nIdeConvo and ");
        sql.Append("t1.dFecIniVig >= convert(date,'").Append(fec_IniVig).Append("',103) and t1.dFecFinVig<=convert(date,'").Append(fec_FinVig).Append("',103)");

        if (!string.IsNullOrEmpty(n_ClaseTramite))
        {
            sql.Append("and t1.nIdeClaseSol=").Append(n_ClaseTramite);
        }
        if (!string.IsNullOrEmpty(ide_Empresa))
        {
            sql.Append("and t2.nIdeEmpresa=").Append(ide_Empresa);
        }
            
            //sql.Append("t1.dFecIniVig >= convert(date,'01/01/2014',103) and t1.dFecFinVig<=convert(date,'23/01/2014',103)




           // sql.Append("select t1.* "); 
           // sql.Append("from SIPMaeConvocatoria t1 ");
           // sql.Append("where t1.dFecIniVig >= convert(date,'").Append(fec_IniVig).Append("',103) and t1.dFecFinVig<=convert(date,'").Append(fec_FinVig).Append("',103)");



            lista = db.Database.SqlQuery<SIPMaeConvocatoria>(sql.ToString()).ToList();

         //   var max = db.Database.SqlQuery<Decimal>(sql.ToString());
          //  lista = max.ToList<SIPMaeConvocatoria>();


            /*
            var listaConvocatoria = sql.ToString().AsQueryable();

            foreach (dynamic item in listaConvocatoria)
            {
                itemConvo = new SIPMaeConvocatoria();
                itemConvo.nIdeConvo = item.nIdeConvo;
                itemConvo.vDescr = item.vDescr;
                itemConvo.nNumeConvo = item.nNumeConvo;
                itemConvo.nAnio = item.nAnio;
                itemConvo.vTipoConvo = item.vNomCorto;
                itemConvo.nCantTotaBeca = item.nCantTotaBeca;
                itemConvo.vRazonSocial = item.vRazonSocial;
                itemConvo.dFecIniVig = item.dFecIniVig;
                itemConvo.dFecFinVig = item.dFecFinVig;
                itemConvo.vClase = item.clase;
                itemConvo.nSaldo = item.nSaldo;
                lista.Add(itemConvo);
            }
            */


            return lista;
        }


        public List<SIPMaeConvocatoria> ListarConvocatoriaDAO_old2(string fec_IniVig, string fec_FinVig, string ide_Empresa, string n_ClaseTramite)
        {
            
            DateTime fecIniVig = UtilitariosUtil.formatearFecha(fec_IniVig);
            DateTime fecFinVig = UtilitariosUtil.formatearFecha(fec_FinVig);
            List<SIPMaeConvocatoria> lista = new List<SIPMaeConvocatoria>();
            SIPMaeConvocatoria itemConvo = null;

        //    int rpta = db.SIPDetVinculoEmpresa.Where(s => s.nIdeEmpresa == n_IdeEmpresa && s.nIdeTipoVinculo == n_IdeVinculo && (s.dFecFinVig == null ? DateTime.Today : s.dFecFinVig) >= DateTime.Today && s.dFecIniVig <= DateTime.Today).Count();
            //int rpta = db.SIPDetEstadoCivil.Where(s => s.nIdePersona == n_IdePersona && s.nIdeEstadoCivil == idEstadoCivil && (s.dFecFinVig == null ? DateTime.Now : s.dFecFinVig) >= DateTime.Now && s.dFecIniVig <= DateTime.Now).Count();
            //int rpta = db.SIPDetEstadoCivil.Where(s => s.nIdePersona == n_IdePersona && s.nIdeEstadoCivil == idEstadoCivil && (s.dFecFinVig == null ? DateTime.Now : s.dFecFinVig) >= DateTime.Now && s.dFecIniVig <= DateTime.Now).Count();

            if (string.IsNullOrEmpty(ide_Empresa))
            {
               
                
                
                
                
                
                var listaConvocatoria = (from t1 in db.SIPMaeConvocatoria
                                         join t2 in db.SIPDetConvocatoria on t1.nIdeConvo equals t2.nIdeConvo
                                         join t3 in db.SIPDetCompendio on t1.nIdeTipoConvo equals t3.nIdeDetalle
                                         join t4 in db.SIPMaeEmpresa on t2.nIdeInstitucion equals t4.nIdeEmpresa
                                         where t1.dFecIniVig >= fecIniVig && (t1.dFecFinVig == null ? DateTime.Today : t1.dFecFinVig) <= fecFinVig
                                         select new { t1.nIdeConvo, t1.nNumeConvo, t1.nAnio, t1.vDescr, t1.nCantTotaBeca, t3.vNomCorto,
                                                      t4.vRazonSocial, t1.dFecIniVig, t1.dFecFinVig, clase=t1.SIPDetCompendio1.vNomCorto,t1.nSaldo }

                 ).OrderByDescending(s=>s.nIdeConvo);

                foreach (dynamic item in listaConvocatoria)
                {
                    itemConvo = new SIPMaeConvocatoria();
                    itemConvo.nIdeConvo     = item.nIdeConvo;
                    itemConvo.vDescr        = item.vDescr;
                    itemConvo.nNumeConvo    = item.nNumeConvo;
                    itemConvo.nAnio         = item.nAnio;
                    itemConvo.vTipoConvo    = item.vNomCorto;
                    itemConvo.nCantTotaBeca = item.nCantTotaBeca;
                    itemConvo.vRazonSocial  = item.vRazonSocial;
                    itemConvo.dFecIniVig    = item.dFecIniVig;
                    itemConvo.dFecFinVig    = item.dFecFinVig;
                    itemConvo.vClase        = item.clase;
                    itemConvo.nSaldo        = item.nSaldo;
                    lista.Add(itemConvo);
                }
            }
            else
            {
                int institucion = Int32.Parse(ide_Empresa);
                var listaConvocatoria = (from t1 in db.SIPMaeConvocatoria
                                         join t2 in db.SIPDetConvocatoria on t1.nIdeConvo equals t2.nIdeConvo
                                         join t3 in db.SIPDetCompendio on t1.nIdeTipoConvo equals t3.nIdeDetalle
                                         join t4 in db.SIPMaeEmpresa on t2.nIdeInstitucion equals t4.nIdeEmpresa
                                         where t1.dFecIniVig >= fecIniVig && (t1.dFecFinVig == null ? DateTime.Today : t1.dFecFinVig) <= fecFinVig 
                                         && t2.nIdeInstitucion == institucion
                                         select new { t1.nIdeConvo, t1.nNumeConvo, t1.nAnio, t1.vDescr, t1.nCantTotaBeca, t3.vNomCorto,
                                                      t4.vRazonSocial,
                                                      t1.dFecIniVig,
                                                      t1.dFecFinVig,
                                                      clase = t1.SIPDetCompendio1.vNomCorto,
                                                      t1.nSaldo
                                         }
                                        ).OrderByDescending(s => s.nIdeConvo); 
                foreach (dynamic item in listaConvocatoria)
                {
                    itemConvo = new SIPMaeConvocatoria();
                    itemConvo.nIdeConvo     = item.nIdeConvo;
                    itemConvo.vDescr        = item.vDescr;
                    itemConvo.nNumeConvo    = item.nNumeConvo;
                    itemConvo.nAnio         = item.nAnio;
                    itemConvo.vTipoConvo    = item.vNomCorto;
                    itemConvo.nCantTotaBeca = item.nCantTotaBeca;
                    itemConvo.vRazonSocial  = item.vRazonSocial;
                    itemConvo.dFecIniVig    = item.dFecIniVig;
                    itemConvo.dFecFinVig    = item.dFecFinVig;
                    itemConvo.vClase        = item.clase;
                    itemConvo.nSaldo        = item.nSaldo;
                    lista.Add(itemConvo);
                }
            }
            

            /*
           var listaConvocatoria = (from MaeConvocatoria in db.SIPMaeConvocatoria
                                    join DetConvocatoria in db.SIPDetConvocatoria
                                    on MaeConvocatoria.nIdeConvo equals DetConvocatoria.nIdeConvo
                                    where MaeConvocatoria.dFecIniVig >= fecIniVig && MaeConvocatoria.dFecFinVig <= fecFinVig
                                    select new { MaeConvocatoria.nAnio, DetConvocatoria.nIdeInstitucion,
                                    xx = from DetCompendio in db.SIPDetCompendio
                                         where MaeConvocatoria.nIdeTipoConvo == DetCompendio.nIdeDetalle
                                         select DetCompendio.vNomCorto
                                    }
                                  ).ToList();

           
           var items = (from rc in context.CLEARANCE_COST
                        join c in context.COST_TYPES on rc.COST_ID equals c.COST_ID
                        join d in context.CLEARANCE_REQUEST on rc.REQUEST_ID equals d.REQUEST_ID
                        join f in context.CURRENCY_UNITS on rc.CURRENCY_ID equals f.CURRENCY_ID
                        select new
                        {

                            rc.COST_AMOUNT,
                            c.COST_ID,
                            c.COST_NAME,
                            d.WAYBILL_NO,
                            f.CURRENCY_NAME
                        }).ToList();
            * select new { MaeConvocatoria.nNumeConvo, MaeConvocatoria.nAnio, xxx= DetCompendio1.vNomCorto }
           */
           
           
            

          
          return lista;
        }

        public IList<dynamic> ListadoSolicitudesDAO(int nIdeConvo)
        {
            String[] parametros = new String[] { nIdeConvo.ToString() };
            String[] nombreParametros = new String[] { "nIdeConvo" };
            IList<dynamic> lista = SqlExecutorSP.executeStore("paSolicitantePorConvocatoria", parametros, nombreParametros);
            return lista;
        }

        public int addNuevaConvocatoriaPabeDAO(SIPMaeConvocatoria convocatoria)
        {

            convocatoria.nAnio = UtilitariosUtil.yearNow();
            convocatoria.nNumeConvo = getNumeroConvocatoria(convocatoria.nIdeClaseSol);
            convocatoria.dtFecReg = DateTime.Now;
            
            
            db.SIPMaeConvocatoria.Add(convocatoria);
            db.SaveChanges();

            return Int32.Parse(convocatoria.nIdeConvo.ToString());
            //db = new BDSIPFEEntities();
            //return db.SIPMaeConvocatoria.FirstOrDefault(x => x.nIdeConvo == convocatoria.nIdeConvo);
            
            //.Where(x => x.nIdeConvo == convocatoria.nIdeConvo).ToList();
        }
    }
}
